/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle.gui.frames.internos;

import controle.gui.frames.ControleFramePrincipal;
import controle.gui.frames.internos.superclasses.Controle;
import controle.gui.utils.*;
import controle.interfaces.Constantes;
import gui.frames.FramePrincipal;
import gui.frames.internos.IFBusca;
import gui.frames.internos.IFImoveis;
import java.util.*;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import modelo.*;
import persistencia.dao.AbstractDAO;
import persistencia.dao.TransacaoDAO;

/**
 * @author Maycon Fernando Silva Brito
 * @author mayconfsbrito@gmail.com
 */
public class ControleImoveis extends Controle {

    /*
     * Variáveis da classe
     */
    private IFImoveis frame = null;
    /*
     * Construtor da classe
     */

    public ControleImoveis(IFImoveis frame) {
        super(frame);
        this.frame = frame;
    }

    /**
     * Inicializa o frame
     */
    public void inicializa() {

        //Torna o frame visível
        frame.setVisible(true);

        //Limita o tamanho do JTextField
        TamanhoJTextField.limitaTamanho(new int[]{7, 100}, frame.textNumero, frame.textBuscaNumero);

        this.limparGUI();

        //Inicializa eventos da tabela
        frame.tabela.getSelectionModel().addListSelectionListener(frame.listener);
        frame.tabela.getColumnModel().getSelectionModel().addListSelectionListener(frame.listener);

    }

    /**
     * Especificações em @InternalFrame
     */
    public void guiAtiva(boolean estado) {
        if (estado) {
            setEnabledGUIElements.enabledJComponent(frame.buttonCadastro);
            setEnabledGUIElements.disabledJComponent(frame.buttonAlterar);

        } else {
            setEnabledGUIElements.enabledJComponent(frame.buttonAlterar);
            setEnabledGUIElements.disabledJComponent(frame.buttonCadastro);
        }
    }

    /**
     * Verifica o acesso do usuário para utilizar o frame
     */
    protected void verificaAcessos() {

        /*
         * Verifica a permissao de @user para este frame
         */
        if (!ControleFramePrincipal.acessos.get(Constantes.PERMISSAO_CADASTRA_ALTERA_LOCAIS).isAcesso()) {
            EnabledGUIElements.disabledJComponent(frame.buttonCadastro, frame.buttonAlterar);
        }
    }

    /**
     * Limpa os componentes do frame
     */
    public void limparGUI() {

        frame.tabela.clearSelection();
        new ApagaElementosDaInterface().apagaJTextField(frame.textId, frame.textNumero, frame.textCodigoLocalidade, frame.textNumero,
                frame.textComplemento, frame.textNomeLogradouro, frame.textIdLogradouro, frame.textNomeMunicipio,
                frame.textCodigoMunicipio, frame.textNomeLocalidade);
        new ApagaElementosDaInterface().apagaModelJComboBox(frame.comboQuadra, frame.comboQuadra);
        EnabledGUIElements.disabledJComponent(frame.textCodigoLocalidade, frame.textNomeLocalidade, frame.textNomeLogradouro,
                frame.textIdLogradouro, frame.buttonSelecionarLogradouro, frame.comboQuadra, frame.textNumero, frame.textComplemento, frame.buttonSelecionarLocalidade);

        //Configura o comportamento da gui de acordo com as permissões do usuário
        this.guiAtiva(true);
        this.verificaAcessos();
    }

    /**
     * Preenche todos os componentes da GUI a partir do objeto selecionado na
     * tabela
     */
    public void tabelaPreencheGUI() {

        int linha = frame.tabela.getSelectedRow();
        Integer cod;
        try {
            cod = (Integer) frame.tabela.getValueAt(linha, 0);
        } catch (IndexOutOfBoundsException er) {
            cod = 0;
            return;
        }
        List<Imovel> consulta = AbstractDAO.consultar(
                "from modelo.Imovel i LEFT JOIN FETCH i.quadra q LEFT JOIN FETCH i.logradouro lg LEFT JOIN FETCH q.localidade lc LEFT JOIN FETCH lc.municipio m where idImovel=" + cod);

        if (consulta.size() > 0) {
            Imovel imv = consulta.get(0);
            Localidade loc = imv.getQuadra().getLocalidade();
            Municipio municipio = loc.getMunicipio();
            frame.textId.setText(Integer.toString(imv.getIdImovel()));
            frame.textCodigoMunicipio.setText(municipio.getCodigo());
            frame.textNomeMunicipio.setText(municipio.getNome());
            frame.textCodigoLocalidade.setText(loc.getCodigo().toString());
            frame.textNomeLocalidade.setText(loc.getNome());
            frame.textNomeLogradouro.setText(imv.getLogradouro().getNome());
            frame.textIdLogradouro.setText(imv.getLogradouro().getIdLogradouro().toString());
            this.carregaQuadras(imv.getQuadra().getLocalidade(), frame.comboQuadra, frame.textIdLogradouro, frame.textCodigoLocalidade, frame.textCodigoMunicipio);
            frame.comboQuadra.setSelectedItem(imv.getQuadra().getCodigo());
            frame.textNumero.setText(imv.getNumero() + "");
            frame.textComplemento.setText(imv.getComplemento());

            //Configura o comportamento dos botões da interface
            EnabledGUIElements.enabledJComponent(frame.textCodigoLocalidade, frame.buttonSelecionarLogradouro, frame.comboQuadra,
                    frame.textNumero, frame.textComplemento, frame.buttonSelecionarLocalidade);
            this.guiAtiva(false);
            this.verificaAcessos();
        }

    }

    /**
     * Especificações do método em @InternalFrame
     */
    protected void listarTodosElementosNaTabela() {

        List<Imovel> list = AbstractDAO.listar("Imovel");

        if (list != null) {
            listarPesquisaNaTabela(list);
        }


    }

    /**
     * Especificações do método em @InternalFrame
     */
    private void listarPesquisaNaTabela(List<Imovel> list) {

        frame.tabela.getColumnModel().getColumn(0).setMinWidth(50);
        frame.tabela.getColumnModel().getColumn(1).setMinWidth(50);
        frame.tabela.getColumnModel().getColumn(2).setMinWidth(100);
        frame.tabela.getColumnModel().getColumn(3).setMinWidth(200);
        frame.tabela.getColumnModel().getColumn(4).setMinWidth(80);
        frame.tabela.getColumnModel().getColumn(5).setMinWidth(80);
        frame.tabela.getColumnModel().getColumn(6).setMinWidth(50);

        DefaultTableModel modelo = (DefaultTableModel) frame.tabela.getModel();
        modelo.setNumRows(0);
        limparGUI();

        try {
            if (list != null) {
                for (int i = 0; i < list.size(); i++) {
                    Imovel imv = list.get(i);
                    modelo.addRow(new Object[]{imv.getIdImovel(), imv.getNumero(), imv.getComplemento(), imv.getLogradouro().getNome(),
                                imv.getQuadra().getLocalidade().getMunicipio().getCodigo(), imv.getQuadra().getLocalidade().getCodigo(), imv.getQuadra().getCodigo()});
                }
            }
        } catch (Exception er) {
            JOptionPane.showMessageDialog(frame, "Erro ao listar os objetos na tabela!\n\n" + er, "Erro na listagem!", JOptionPane.ERROR_MESSAGE);
            er.printStackTrace();
        }

        //Permite o evento de ordernar a tabela a partir do click do mouse
        frame.tabela.setAutoCreateRowSorter(true);
    }

    /**
     * Instancia o imóvel a partir dos elementos da interface gráfica
     *
     * @return
     */
    public Imovel criaImovel(int opcao) {

        //Caso o usuário confirme o evento
        if (opcao == JOptionPane.YES_OPTION) {

            //Verifica se o nome da logradouro está preenchido
            if (!frame.textNumero.getText().trim().isEmpty()) {

                //Verifica se o logradouro foi selecionado
                if (!frame.textIdLogradouro.getText().isEmpty()) {

                    //Instancia as variáveis
                    String numero = frame.textNumero.getText();
                    Localidade loc = null;
                    Quadra quadra = null;
                    Logradouro log = null;

                    //Define o município
                    Municipio municipio = (Municipio) AbstractDAO.consultar("Municipio", "codigo like'" + frame.textCodigoMunicipio.getText() + "'").get(0);
                    if (municipio != null) {

                        //Define a localidade
                        if (!frame.textCodigoLocalidade.getText().isEmpty()) {
                            List<Localidade> listLoc = AbstractDAO.consultar("Localidade", "codigo=" + frame.textCodigoLocalidade.getText() + " AND idMunicipio=" + municipio.getIdMunicipio());
                            if (!listLoc.isEmpty()) {
                                loc = listLoc.get(0);

                            } else {
                                JOptionPane.showMessageDialog(frame, "Atenção! Localidade inválida.", "Localidade inválida!", JOptionPane.WARNING_MESSAGE);
                                return null;
                            }
                        } else {
                            JOptionPane.showMessageDialog(frame, "Atenção! Preencha a localidade.", "Localidade inválida!", JOptionPane.WARNING_MESSAGE);
                            return null;

                        }

                        //Define o logradouro
                        List<Logradouro> listLog = getListLogradouro(frame.textIdLogradouro.getText());
                        if (!listLog.isEmpty()) {
                            log = listLog.get(0);

                        } else {
                            JOptionPane.showMessageDialog(frame, "Atenção! Defina o logradouro válido para este imóvel.", "Logradouro não definido!", JOptionPane.WARNING_MESSAGE);
                            return null;
                        }

                        //Define a quadra
                        if (frame.comboQuadra.getSelectedIndex() != 0) {
                            List<Quadra> listQua = AbstractDAO.consultar("Quadra", "codigo=" + frame.comboQuadra.getSelectedItem().toString() + " AND idLocalidade=" + loc.getIdLocalidade());
                            if (!listQua.isEmpty()) {
                                quadra = listQua.get(0);

                            } else {
                                JOptionPane.showMessageDialog(frame, "Atenção! Não existe uma quadra com este número para esta localidade.", "Quadra inexistente!", JOptionPane.WARNING_MESSAGE);
                                return null;

                            }
                        } else {
                            JOptionPane.showMessageDialog(frame, "Atenção! O número da quadra deve ser definido.", "Quadra não definida!", JOptionPane.WARNING_MESSAGE);
                            return null;

                        }

                        String complemento = null;
                        if (!frame.textComplemento.getText().isEmpty()) {
                            complemento = frame.textComplemento.getText();
                        }
                        Imovel imv = new Imovel(quadra, log, numero, complemento);

                        //Verifica o id do imovel
                        if (!frame.textId.getText().trim().isEmpty()) {
                            imv.setIdImovel(Integer.parseInt(frame.textId.getText().trim()));

                        } else {
                            imv.setIdImovel(AbstractDAO.max(Imovel.class, "idImovel") + 1);
                        }

                        //Verifica se já existe um mesmo número de imóvel para este logradouro
                        if (this.verificaNumeroRepetido(imv)) {
                            JOptionPane.showMessageDialog(frame, "Atenção! Já existe um imóvel cadastrado com este mesmo número e complemento para este logradouro.", "Número repetido!", JOptionPane.WARNING_MESSAGE);
                            return null;
                        }

                        //Retorna o objeto
                        return imv;

                    } else {
                        JOptionPane.showMessageDialog(frame, "Atenção! Defina um município válido.", "Município não definido!", JOptionPane.WARNING_MESSAGE);
                    }

                } else {
                    JOptionPane.showMessageDialog(frame, "Atenção! O logradouro deve ser selecionado.", "Logradouro não selecionado!", JOptionPane.WARNING_MESSAGE);
                }

            } else {
                JOptionPane.showMessageDialog(frame, "Atenção! O numero do imóvel deve ser preenchido.", "Numero não preenchido!", JOptionPane.WARNING_MESSAGE);

            }
        }
        return null;

    }

    /**
     * Cadastra uma imóvel através do frame
     */
    public void cadastrar() {

        //Pergunta ao usuário se ele deseja realizar o cadastro
        int opcao = JOptionPane.showOptionDialog(frame, "Tem certeza que deseja cadastrar o imóvel?", "Cadastro de imóvel",
                JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, frame.botoesOpcoes, frame.botoesOpcoes[0]);

        //Captura o objeto no frame
        Imovel imv = this.criaImovel(opcao);

        //Realiza o cadastro
        if (imv != null) {
            if (AbstractDAO.cadastrar(imv)) {
                JOptionPane.showMessageDialog(frame, "Imóvel cadastrado com sucesso!", "Cadastro.", JOptionPane.INFORMATION_MESSAGE);
                this.limparGUI();
                this.buscar();

                //Log do Agente
                int id = AbstractDAO.max(Imovel.class, "idImovel");
                TransacaoDAO.cadastrar("Cadastrou o imóvel id=" + id + ".");
            }
        }

    }

    /**
     * Altera um logradouro através do frame
     */
    public void alterar() {

        //Pergunta ao usuário se ele deseja realizar o cadastro
        int opcao = JOptionPane.showOptionDialog(frame, "Tem certeza que deseja alterar o imóvel?", "Alteração de imóvel",
                JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, frame.botoesOpcoes, frame.botoesOpcoes[0]);

        //Captura o objeto no frame
        Imovel imv = this.criaImovel(opcao);

        //Realiza o cadastro
        if (imv != null) {
            if (AbstractDAO.alterar(imv)) {
                JOptionPane.showMessageDialog(frame, "Imóvel Alterado com sucesso!", "Alteração.", JOptionPane.INFORMATION_MESSAGE);
                this.limparGUI();
                this.buscar();

                //Log do Agente
                TransacaoDAO.cadastrar("Alterou o imóvel id=" + imv.getIdImovel() + ".");
            }
        }

    }

    /**
     * Exclui um imóvel através do frame
     */
    public void excluir() {

        //Pergunta ao usuário se ele deseja excluir
        int opcao = JOptionPane.showOptionDialog(frame, "Tem certeza que deseja excluir o imóvel?", "Exclusão de imóvel",
                JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, frame.botoesOpcoes, frame.botoesOpcoes[0]);

        //Captura o objeto no frame
        Imovel imv = this.criaImovel(opcao);

        //Realiza o cadastro
        if (imv != null) {
            if (AbstractDAO.excluir(imv)) {
                JOptionPane.showMessageDialog(frame, "Imóvel excluído com sucesso!", "Exclusão.", JOptionPane.INFORMATION_MESSAGE);
                this.limparGUI();
                this.buscar();

                //Log do Agente
                TransacaoDAO.cadastrar("Excluiu o imóvel id=" + imv.getIdImovel() + ".");
            }
        }

    }

    /**
     * Realiza a busca de um determinado objeto a partir dos parâmetros
     * definidos no @frame
     */
    public void buscar() {

        //Captura os parametros do frame
        String codigoMunicipio = frame.textBuscaCodigoMunicipio.getText();
        String codigoLocalidade = frame.textBuscaCodigoLocalidade.getText();
        String nomeLogradouro = frame.textBuscaNomeLogradouro.getText();
        String numeroQuadra = frame.comboBuscaQuadra.getSelectedItem().toString();
        String numeroImovel = frame.textBuscaNumero.getText();

        //Realiza a busca no bd
        List<Imovel> list = null;

        //Incrementa a string para consutar a busca
        String query = "";
        if (numeroImovel != null && !numeroImovel.trim().equals("")) {
            query += "i.numero=" + numeroImovel + " ";
        }
        if (codigoMunicipio != null && !codigoMunicipio.isEmpty()) {

            //Verifica se o código do município existe
            List<Municipio> listMun = AbstractDAO.consultar("Municipio", "codigo='" + codigoMunicipio + "'");
            if (listMun.size() > 0) {

                Municipio mun = listMun.get(0);

                //Incrementa a busca por localidade
                if (!codigoLocalidade.trim().isEmpty()) {
                    List<Localidade> listLoc = AbstractDAO.consultar("Localidade", "idMunicipio=" + mun.getIdMunicipio() + " AND codigo='" + codigoLocalidade + "'");
                    if (!listLoc.isEmpty()) {

                        Localidade loc = listLoc.get(0);

                        //Incrementa a busca por quadra selecionada
                        if (frame.comboBuscaQuadra.getSelectedIndex() != 0) {
                            if (query.length() > 1) {
                                query += " AND ";
                            }
                            Quadra qua = (Quadra) AbstractDAO.consultar("Quadra", "idLocalidade=" + loc.getIdLocalidade() + " AND codigo=" + numeroQuadra).get(0);
                            query += " q.idQuadra=" + qua.getIdQuadra();

                            //Incrementa a busca por todas as quadras da localidade
                        } else {
                            List<Quadra> listQuadras = AbstractDAO.consultar("Quadra", "idLocalidade=" + loc.getIdLocalidade());
                            if (!listQuadras.isEmpty()) {
                                if (query.length() > 1) {
                                    query += " AND ";
                                }

                                query += " q.idQuadra in (";
                                for (int index = 0; index < listQuadras.size(); index++) {
                                    query += listQuadras.get(index).getIdQuadra();
                                    if (index < listQuadras.size() - 1) {
                                        query += ", ";
                                    }
                                }
                                query += ")";
                            }
                        }
                    }

                } else {
                    JOptionPane.showMessageDialog(frame, "Por favor, selecione a localidade para realizar a busca.", "Selecione a localidade!",
                            JOptionPane.WARNING_MESSAGE);
                    return;
                }

                //Incrementa a busca por logradouro
                if (!nomeLogradouro.trim().isEmpty()) {
                    List<Logradouro> listLog = AbstractDAO.consultar("Logradouro", "idMunicipio=" + mun.getIdMunicipio() + " AND nome like '" + nomeLogradouro + "'");
                    if (!listLog.isEmpty()) {

                        if (query.length() > 1) {
                            query += " AND ";
                        }
                        query += " l.idLogradouro=" + listLog.get(0).getIdLogradouro();

                    }
                }

            } else {
                JOptionPane.showMessageDialog(frame, "Não existe nenhum município com este código.", "Código de município inexistente!",
                        JOptionPane.WARNING_MESSAGE);
                return;
            }

        }

        if (!query.equals("")) {
            list = (List<Imovel>) AbstractDAO.consultar(
                    "from Imovel i LEFT JOIN FETCH i.quadra q LEFT JOIN FETCH i.logradouro l LEFT JOIN FETCH q.localidade lc LEFT JOIN FETCH lc.municipio where " + query);
        }

        //Lista os objetos encontrados na tabela
        if (list != null) {
            this.listarPesquisaNaTabela(list);
        } else {
            this.listarPesquisaNaTabela(null);
        }
    }

    /**
     * Limpa apenas os componentes de busca e lista a tabela de objetos com
     * todos os objetos do bd
     */
    public void limparBusca() {

        new ApagaElementosDaInterface().apagaJTextField(frame.textBuscaNomeLocalidade, frame.textBuscaNomeLogradouro, frame.textBuscaNumero, frame.textBuscaCodigoLocalidade,
                frame.textBuscaCodigoMunicipio, frame.textBuscaNomeMunicipio, frame.textBuscaIdLogradouro);
        EnabledGUIElements.disabledJComponent(frame.textBuscaNomeLocalidade, frame.textBuscaNomeLogradouro, frame.comboBuscaQuadra,
                frame.textBuscaNumero, frame.textBuscaCodigoLocalidade, frame.textBuscaNomeMunicipio, frame.buttonBuscaSelecionarLocalidade, frame.buttonBuscaSelecionarLogradouro);
        new ApagaElementosDaInterface().apagaModelJComboBox(frame.comboBuscaQuadra, frame.comboQuadra);
        this.listarPesquisaNaTabela(null);

    }

    /**
     * Carrega um combobox a partir de um determinado município
     *
     * @return
     */
    public boolean carregaLocalidades(Municipio mun, JComboBox comboLocalidades) {

        comboLocalidades.setModel(ComboBoxUtils.inicializaComboBoxEntidades("Selecione...", "Localidade where idMunicipio=" + mun.getIdMunicipio(), "nome"));

        return true;
    }

    /**
     * Carrega um combobox a partir de uma determinada localidade e logradouro
     *
     * @return
     */
    public boolean carregaQuadras(Localidade loc, JComboBox comboQuadra, JTextField textIdLogradouro, JTextField textCodigoLocalidade, JTextField textCodigoMunicipio) {

        //Captura os locais
        List<Logradouro> listLog = AbstractDAO.consultar(
                "from Logradouro l "
                + "LEFT JOIN fetch l.quadralogradouros ql "
                + "LEFT JOIN fetch ql.quadra q "
                + "LEFT JOIN fetch q.localidade lc "
                + "LEFT JOIN FETCH lc.municipio loc where l.idLogradouro="
                + textIdLogradouro.getText());

        if (listLog != null && loc != null) {

            //Percorre todas as Quadralogradouro do logradouro e verifica a localidade das mesmas
            DefaultComboBoxModel model = new DefaultComboBoxModel();
            model.addElement("Selecione...");

            TreeSet<Quadra> setQuadras = new TreeSet<Quadra>();
            for (Iterator it = listLog.get(0).getQuadralogradouros().iterator(); it.hasNext();) {
                
                Quadralogradouro ql = (Quadralogradouro) it.next();
                if (ql.getQuadra().getLocalidade().getIdLocalidade().equals(loc.getIdLocalidade())) {
                    setQuadras.add(ql.getQuadra());
                }
            }

            for (Iterator it = setQuadras.iterator(); it.hasNext();) {
                Quadra qua = (Quadra)it.next();
                model.addElement(qua.getCodigo());
            }

            if (model.getSize() < 2) {
                JOptionPane.showMessageDialog(frame, "Não existe nenhum quadra cadastrada nesta localidade para este logradouro.", "Atenção!",
                        JOptionPane.WARNING_MESSAGE);

                return false;
            }

            comboQuadra.setModel(model);
            comboQuadra.setEnabled(true);


        } else {
            comboQuadra.setModel(new DefaultComboBoxModel(new String[]{"Selecione..."}));
            comboQuadra.setEnabled(false);
        }

        return true;


    }

    /**
     * Abre um outro frama para definição do logradouro
     *
     * @return
     */
    public boolean eventoButtonSelecionarLogradouro(String codMunicipio, boolean isBusca) {

        //Captura as informações da quadra
        List<Municipio> listMun = AbstractDAO.consultar("Municipio", "codigo='" + codMunicipio + "'");
        if (listMun.isEmpty()) {
            JOptionPane.showMessageDialog(frame, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return false;
        }

        //Focaliza o novo JInternalFrame
        IFBusca frameAdd = new IFBusca(this, Logradouro.class, IFImoveis.class, "idMunicipio=" + listMun.get(0).getIdMunicipio(), isBusca);
        FramePrincipal.desktopPanel.add(frameAdd);
        FramePrincipal.desktopPanel.getDesktopManager().activateFrame(frameAdd);

        return true;
    }

    /**
     * Insere o logradouro na Gui
     */
    public boolean setGuiLogradouro(Logradouro log) {

        if (log != null) {
            List<Localidade> listLoc = getListLocalidade(frame.textCodigoLocalidade.getText(), log.getMunicipio());
            if (listLoc != null) {
                frame.textIdLogradouro.setText(log.getIdLogradouro().toString());
                frame.textNomeLogradouro.setText(log.getNome());
                EnabledGUIElements.enabledJComponent(frame.buttonSelecionarLogradouro);
                if (this.carregaQuadras(listLoc.get(0), frame.comboQuadra, frame.textIdLogradouro, frame.textCodigoLocalidade, frame.textCodigoMunicipio)) {
                    return true;
                }
            }
        }

        return false;
    }

    public boolean setGuiLogradouroBusca(Logradouro log) {

        if (log != null) {
            List<Localidade> listLoc = getListLocalidade(frame.textBuscaCodigoLocalidade.getText(), log.getMunicipio());
            if (listLoc != null) {
                frame.textBuscaIdLogradouro.setText(log.getIdLogradouro().toString());
                frame.textBuscaNomeLogradouro.setText(log.getNome());
                EnabledGUIElements.enabledJComponent(frame.buttonBuscaSelecionarLogradouro);
                if (this.carregaQuadras(listLoc.get(0), frame.comboBuscaQuadra, frame.textBuscaIdLogradouro, frame.textBuscaCodigoLocalidade, frame.textBuscaCodigoMunicipio)) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * Insere na Gui a localidade buscada
     */
    public boolean setGuiLocalidade(Localidade loc) {

        if (loc != null) {
            frame.textCodigoLocalidade.setText(loc.getCodigo().toString());
            frame.textNomeLocalidade.setText(loc.getNome());
            frame.buttonSelecionarLogradouro.setEnabled(true);
            new ApagaElementosDaInterface().apagaJTextField(frame.textIdLogradouro, frame.textNomeLogradouro);

            return true;
        }

        return false;
    }

    public boolean setGuiLocalidadeBusca(Localidade loc) {

        if (loc != null) {
            frame.textBuscaCodigoLocalidade.setText(loc.getCodigo().toString());
            frame.textBuscaNomeLocalidade.setText(loc.getNome());
            frame.buttonBuscaSelecionarLogradouro.setEnabled(true);
            new ApagaElementosDaInterface().apagaJTextField(frame.textBuscaIdLogradouro, frame.textBuscaNomeLogradouro);

            return true;
        }

        return false;
    }

    /**
     * Evento do comboBox de Logradouro
     *
     * @return
     */
    public boolean eventoComboLogradouro(JTextField textCodigoMunicipio, JTextField textCodigoLocalidade, JComboBox comboLogradouro, JComboBox comboQuadra) {

        if (textCodigoMunicipio.getText().isEmpty()
                || textCodigoLocalidade.getText().isEmpty()
                || comboLogradouro.getSelectedIndex() == 0) {
            return false;
        }

        //Verifica se o município existe
        List<Municipio> listMun = AbstractDAO.consultar("Municipio", "codigo='" + textCodigoMunicipio.getText() + "'");
        if (listMun.isEmpty()) {
            JOptionPane.showMessageDialog(frame, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return false;
        }

        //Captura a localidade
        List<Localidade> listLoc = AbstractDAO.consultar("Localidade", "idMunicipio=" + listMun.get(0).getIdMunicipio() + " AND codigo like '" + textCodigoLocalidade.getText() + "'");
        if (listLoc.isEmpty()) {
            JOptionPane.showMessageDialog(frame, "Não existe nenhuma localidade com este código.", "Código de localidade inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return false;
        }

        //Captura o logradouro
        List<Logradouro> listLog = AbstractDAO.consultar("Logradouro", "idMunicipio=" + listMun.get(0).getIdMunicipio() + " AND nome like '" + comboLogradouro.getSelectedItem() + "'");
        if (listLog != null) {

            //Percorre todas as Quadralogradouro do logradouro e verifica a localidade das mesmas
            DefaultComboBoxModel model = new DefaultComboBoxModel();
            model.addElement("Selecione...");

            for (Iterator it = listLog.get(0).getQuadralogradouros().iterator(); it.hasNext();) {
                Quadralogradouro ql = (Quadralogradouro) it.next();
                if (ql.getQuadra().getLocalidade().getIdLocalidade().equals(listLoc.get(0).getIdLocalidade())) {
                    //Preenche o combobox
                    model.addElement(ql.getQuadra().getCodigo());
                }
            }

            comboQuadra.setModel(model);
            comboQuadra.setEnabled(true);

        } else {
            comboQuadra.setModel(new DefaultComboBoxModel(new String[]{"Selecione..."}));
            comboQuadra.setEnabled(false);
        }

        return true;
    }

    /**
     * Realiza o evendo do combobox de quadra
     *
     * @return
     */
    public boolean eventoComboQuadra(JComboBox comboQuadra, boolean isBusca) {

        if (comboQuadra.getSelectedIndex() != 0) {
            if (isBusca) {
                EnabledGUIElements.enabledJComponent(frame.textBuscaNumero);
            } else {
                EnabledGUIElements.enabledJComponent(frame.textNumero, frame.textComplemento);
            }



        } else {
            if (isBusca) {
                EnabledGUIElements.disabledJComponent(frame.textBuscaNumero);
            } else {
                EnabledGUIElements.disabledJComponent(frame.textNumero, frame.textComplemento);
            }

        }

        return true;
    }

    /**
     * Verifica se já existe um imóvel com o mesmo número para o mesmo
     * logradouro
     *
     * @return
     */
    public boolean verificaNumeroRepetido(Imovel imv) {

        List<Imovel> list = AbstractDAO.consultar("Imovel", "numero='" + imv.getNumero() + "' AND idImovel!=" + imv.getIdImovel() + " AND idLogradouro=" + imv.getLogradouro().getIdLogradouro()
                + " AND complemento='" + imv.getComplemento() + "'");
        if (!list.isEmpty()) {
            return true;
        }

        return false;
    }
}
